package org.addsome.leetcode;

/**
 * 面试题 05.01. 插入
 * 插入。给定两个32位的整数N与M，以及表示比特位置的i与j。编写一种方法，将M插入N，使得M从N的第j位开始，到第i位结束。
 * 假定从j位到i位足以容纳M，也即若M = 10 011，那么j和i之间至少可容纳5个位。例如，不可能出现j = 3和i = 2的情况，因为第3位和第2位之间放不下M。
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/insert-into-bits-lcci
 *
 * @author 14813
 * @date 2020/4/10
 **/
public class InsertIntoBitsLcci {
    private static int insertBits(int N, int M, int i, int j) {
        long del = getDel(i,j);
        long delN = N&del;
        long addM = M<<i;
        return Long.valueOf(delN|addM).intValue();
    }

    private static long getDel(int i, int j){
        long del = 0;
        for (int k = 0; k < i; k++) {
            del+=Math.pow(2,k);
        }
        for (int k = j+1; k < 32; k++) {
            del+=Math.pow(2,k);
        }
        return del;
    }

    public static void main(String[] args) {
        long del = getDel(3,8);
        int N = 29047;
        System.out.println(Integer.toBinaryString(N));
        System.out.println(Long.toBinaryString(del));
        System.out.println(Long.toBinaryString(del&N));
        int M = 11;
        System.out.println(Integer.toBinaryString(M));
        long addM = M<<3;
        System.out.println(Long.toBinaryString(addM));

        System.out.println(Integer.toBinaryString(insertBits(0b10000000000,0b10011,2,6)));
        System.out.println(Integer.toBinaryString(insertBits(0b0,0b11111,0,4)));
    }
}
